
你的毅力讓人佩服,今天我們要來玩玩非同步的模式,將非同步的過程加入觀察,看看迸出什麼火花!
延續著昨天的教學,我們在subscribe的前後印出before及after,並觀察看看印出什麼資訊。
import { Observable } from 'rxjs';
// 被觀察的目標(Observable)
const obs$ = new Observable((subscriber) => {
  subscriber.next('1');
  subscriber.next('2');
  subscriber.next('3');
  subscriber.complete(); // 結束!
});
// 觀察者(Observer)
const observer = {
  next: (data) => console.log(`checked ${data}, next!`),
  error: (err) => console.log(`error is occured: ${err}}`),
  complete: () => console.log(`complete`),
};
// 訂閱
console.log('=== before ==='); //<-- before
obs$.subscribe(observer); // 開始一連串的進行資料的傳遞,就像`data streaming`一樣
console.log('=== after ===');  //<-- after
// 訂閱後印出資訊如下
// === before ===
// checked 1, next!
// checked 2, next!
// checked 3, next!
// === after ===
Observable依循blocking的方式來進行,所以才會先有before,後有after。setInterval來設計async程式。
- 設定 變數count
- 每 1秒鐘 ,count+1,並呼叫
next送出- 5秒過後,結束訂閱
// 被觀察的目標(Observable)
const asyncObs$ = new Observable((subscriber) => {
  // 第一步:加入async程式
  let count = 0;
  const id = setInterval(() => {
    count += 1;
    subscriber.next(count); // next() 送出資料
  }, 1000);
  // 第二步: 回傳一個function來代表 "結束訂閱"(參考補充說明1)
  return () => {
    console.log('結束訂閱!!');
    clearInterval(id);
  };
});
...
// 訂閱
console.log('=== before ===');
const mySubscript$ = asyncObs$.subscribe(observer); // 開始訂閱
setTimeout(() => mySubscript$.unsubscribe(), 5000); // 五秒後結束訂閱
console.log('=== after ===');
// 訂閱後印出資訊如下
// === before ===
// === after ===
// checked 1, next!
// checked 2, next!
// checked 3, next!
// checked 4, next!
// checked 5, next!
// 結束訂閱!!
- 第一步: 加入async程式,每1秒鐘用
next發出訊息- 第二步: 取消訂閱後要呼叫的程式。(這裡稱之為
TeardownLogic,有興趣可以看一下補充說明1)- 第三步: 訂閱,並取得
mySubscript$- 第四步: 設定5秒鐘之後,將
mySubscript$取消訂閱
before及after之後,再處理非同步的部分,依序印出1,2,3,4,5。 
Observable與TearDownLogic的關係如下,這裡看不懂也沒關係,可以先有個概念即可。✍